package main

import "fmt"

// 接口里面的所有方法都没有方法体，且不能包含任何变量 ,
// 多态~~
func main() {
	testInterface()
	testPoly()
}

// 基本测试
func testInterface() {
	fmt.Println("------------基本测试------------")
	u := UsbUser{}
	phone := Phone{}
	camera := Camera{}
	u.working(phone)
	u.working(camera)
}
func testPoly() {
	fmt.Println("------------------------")
	var usbArr [3]Usb
	fmt.Println(usbArr) //[<nil> <nil> <nil>]
	usbArr[0] = Phone{"Phone-01"}
	usbArr[1] = Camera{"Camera-01"}
	usbArr[2] = Phone{"Camera-02"}

	printUsb(usbArr) //[{Phone-01} {Camera-01} {Camera-02}]
}

// Usb 定义一个接口，申明了两个没有实现的方法
type Usb interface {
	Start()
	Stop()
	//Test() 这样会报错
}

// Phone
// @Description: 定义一个手机结构体，实现了Usb接口并且有自己的方法
type Phone struct {
	Name string
}

func (p Phone) Start() {
	fmt.Println("手机开始工作....")
}

func (p Phone) Stop() {
	fmt.Println("手机停止工作....")
}

func (p Phone) phoneMethod() {
	fmt.Println("手机独特的方法....")
}

// Camera
// @Description: 定义一个相机结构体，实现了Usb接口
type Camera struct {
	Name string
}

func (p Camera) Start() {
	fmt.Println("相机开始工作....")
}

func (p Camera) Stop() {
	fmt.Println("相机停止工作....")
}

type UsbUser struct {
}

// 多态体现：多态参数
// 接收一个usb接口类型的变量 ，
func (c UsbUser) working(u Usb) {
	u.Start()
	u.Stop()

}

// 多态体现：多态数组,
func printUsb(u [3]Usb) {
	for _, usb := range u {
		fmt.Println(usb)
	}

}
